package com.tdam2013.grupo09.BD;

import com.tdam2013.grupo09.entidades.Mensaje;
import com.tdam2013.grupo09.entidades.UsuarioLogueado;
import com.tdam2013.grupo09.funcionalidad.Accion;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;



public class BD {

	private BdSQLiteHelper bd;

	public BD(Context contexto) {
		bd = new BdSQLiteHelper(contexto);
	}

	/**
	 * @param nombre_contacto
	 * @param id_accion
	 * Registra las llamadas, emails y sms enviados.
	 */
	public void registrarAccionEnHistorial(String nombre_contacto,String id_accion)
	{
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put("nombre_contacto", nombre_contacto);
		nuevoRegistro.put("tipo", id_accion);		
		nuevoRegistro.put("fecha", Accion.getfechaActual());
		db.insert("Historial", null, nuevoRegistro);		
		db.close();
	}

	/**
	 * @param mje
	 * Registra un mensaje web enviado
	 */
	public void guardarMensajeWeb(Mensaje mje)
	{
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		nuevoRegistro.put("usuario_id", mje.getUsuarioLogueado().getIdUsuario());
		nuevoRegistro.put("contacto_web ", mje.getContactoWeb());
		nuevoRegistro.put("mensaje", mje.getMensaje());
		nuevoRegistro.put("fecha", mje.getFecha());
		nuevoRegistro.put("enviado", mje.getEnviado());

		db.insert("MensajesWeb", null, nuevoRegistro);
		db.close();
	}	

	/**
	 * @return Cursor
	 * Recupera registro de llamadas, sms, email de todos los contactos
	 */
	public Cursor consultarHistorial() 
	{
		SQLiteDatabase db = bd.getReadableDatabase();		
		Cursor c = db.rawQuery("SELECT h.nombre_contacto,a.descripcion,h.fecha FROM Historial h," +
				" Accion a WHERE h.tipo=a.Accion_id ORDER BY h.fecha ASC",null);		
		return c;
	}

	/**
	 * @param usuario_id
	 * @param contacto_web
	 * @return Cursor
	 * Obtiene los mensajes web de un contacto guardados en la BD.
	 */
	public Cursor obtenerMensajesWeb(String usuario_id, String contacto_web) {
		SQLiteDatabase db = bd.getReadableDatabase();
		String[] args = new String[] { usuario_id, contacto_web };
		Cursor c = db.rawQuery(	"SELECT mensaje,fecha,enviado FROM MensajesWeb WHERE usuario_id=? AND contacto_web=?",args);
		return c;
	}
	
	public void borrarMensajesWeb(String usuario_id){
		SQLiteDatabase db = bd.getWritableDatabase();
		String [] parametros= new String[]{usuario_id};		
		db.delete("MensajesWeb", "contacto_web=?", parametros);
		db.close();
	}

	/**
	 * @param nombre
	 * @param password
	 * @return boolean
	 * Registra el usuario web de quien utiliza la aplicacion.
	 */	
	public boolean registrarUsuarioWeb(String nombre, String password) {
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		try {
			nuevoRegistro.put("nombre", nombre);
			nuevoRegistro.put("password", password);
			nuevoRegistro.put("logueado", 0);
			db.insert("UsuarioWeb", null, nuevoRegistro);
			db.close();
			return true;
		} catch (Exception e) {
			db.close();
			return false;
		}
	}

	/**
	 * @param nombre
	 * @param password
	 * @return boolean
	 * Verifica si existe el usuario web que se quiere registrar
	 */
	public boolean existeUsuario(String nombre, String password) {
		SQLiteDatabase db = bd.getReadableDatabase();
		String[] args = new String[] { nombre, password };
		Cursor c = db.rawQuery(	"SELECT 1 FROM UsuarioWeb WHERE nombre=? AND password=?", args);
		if (c.moveToFirst()) {
			c.close();
			db.close();
			return true;
		} 
		else {
			c.close();
			db.close();
			return false;
		}
	}

	/**
	 * @param nombre
	 * @param password
	 * @return boolean
	 * Realiza el login de un usuario web ya registrado.
	 */
	public boolean loguearse(String nombre, String password) {
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues actualizar = new ContentValues();
		try {
			actualizar.put("logueado", 0);
			db.update("UsuarioWeb", actualizar, null, null);
			actualizar.put("logueado", 1);
			String where = "nombre='" + nombre + "' AND password='" + password	+ "'";
			db.update("UsuarioWeb", actualizar, where, null);
			db.close();
			return true;
		} catch (Exception e) {
			db.close();
			return false;
		}
	}

	/**
	 * @return UsuarioLogueado
	 * Recupera el usuario que esta actualmente logueado.
	 */
	public UsuarioLogueado getUsuarioActual() {
		SQLiteDatabase db = bd.getReadableDatabase();
		UsuarioLogueado ul;
		Cursor c = db.rawQuery("SELECT usuario_id, nombre, password FROM UsuarioWeb WHERE logueado=1",null);
		if (c.moveToFirst()) {
			ul = new UsuarioLogueado();
			ul.setIdUsuario(c.getInt(0));
			ul.setNombreUsuario(c.getString(1));
			ul.setPassword(c.getString(2));
		} 
		else
			ul = null;
		
		c.close();
		db.close();
		return ul;

	}

	/**
	 * @param id
	 * @return String
	 * Verifica si un contacto tiene usuario web asociado.
	 */
	public String tieneUsuarioWebRegistrado(String id) {
		String usuarioWeb;
		SQLiteDatabase db = bd.getReadableDatabase();
		Cursor c = db.rawQuery("SELECT usuario_web FROM ContactoWeb WHERE contacto_id=" + id,null);

		if (c.moveToFirst())
			usuarioWeb = c.getString(0);
		else
			usuarioWeb = null;

		c.close();
		db.close();
		return usuarioWeb;
	}

	/**
	 * @param contacto_id
	 * @param usuarioWeb
	 * @return boolean
	 * Registra el usuario web de un contacto en la bd
	 */
	public boolean registrarUsuarioWebDeContacto(String contacto_id,
			String usuarioWeb) {
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues nuevoRegistro = new ContentValues();
		try {
			nuevoRegistro.put("contacto_id", contacto_id);
			nuevoRegistro.put("usuario_web", usuarioWeb);
			db.insert("ContactoWeb", null, nuevoRegistro);
			db.close();
			return true;
		} catch (Exception e) {
			db.close();
			return false;
		}
	}

	/**
	 * @param contacto_id
	 * @param usuarioWeb
	 * @return boolean
	 * Actualiza el usuario web de un contacto seleccionado.
	 */
	public boolean actualizarUsuarioWebDeContacto(String contacto_id,String usuarioWeb) {
		SQLiteDatabase db = bd.getWritableDatabase();
		ContentValues actualizarRegistro = new ContentValues();
		try {
			actualizarRegistro.put("usuario_web", usuarioWeb);
			String[] arg = new String[] { contacto_id };
			db.update("ContactoWeb", actualizarRegistro, "contacto_id=?", arg);
			db.close();
			return true;
		} catch (Exception e) {
			db.close();
			return false;
		}
	}

	/**
	 * @return Cursor
	 * Obtiene el listado de los contactos favoritos en la aplicacion
	 */
	public Cursor obtenerContactosFavoritos() {
		SQLiteDatabase db = bd.getReadableDatabase();		
		Cursor c = db.rawQuery("SELECT nombre_contacto,COUNT(nombre_contacto) FROM Historial GROUP BY nombre_contacto ORDER BY 2 DESC LIMIT 5",null);		
		return c;

	}

}
